#!/bin/bash
# filepath: /home/jacky/test/NumPDEs/IVPSolver/test_all_solvers.sh

# 设置输出目录
OUTPUT_DIR="./results"
FIGURE_DIR="./figures"

# 创建输出目录
mkdir -p $OUTPUT_DIR
mkdir -p $FIGURE_DIR

# 测试类型
TYPES=(1 2)

# 不同方法
SOLVERS=(
    "AdamsBashforth[1]"
    "AdamsBashforth[2]"
    "AdamsBashforth[3]"
    "AdamsBashforth[4]"
    "AdamsMoulton[2]"
    "AdamsMoulton[3]"
    "AdamsMoulton[4]"
    "AdamsMoulton[5]"
    "BDF[1]"
    "BDF[2]"
    "BDF[3]"
    "BDF[4]"
    "ClassicalRK"
    "Fehlberg"
    "DormandPrince"
    "ESDIRK"
    "GLRK[1]"
    "GLRK[2]"
    "GLRK[3]"
)

# 不同步长
STEP_SIZES=(0.1 0.01 0.001)

echo "==================== 开始运行测试 ===================="

# 列出所有可用求解器
echo "查看所有可用求解器："
./build/main --list

# 首先测试所有方法在默认步长下的表现
echo "测试所有方法在默认步长下的表现..."
for TYPE in "${TYPES[@]}"; do
    for SOLVER in "${SOLVERS[@]}"; do
        # 替换方法名中的方括号，使其适合作为文件名
        SOLVER_FILENAME=$(echo $SOLVER | tr '[]' '_')
        # OUTPUT_FILE="${OUTPUT_DIR}/${SOLVER_FILENAME}_type${TYPE}_default.txt"
        OUTPUT_FILE="${SOLVER_FILENAME}_type${TYPE}_default.txt"
        
        echo "运行: $SOLVER (类型 $TYPE) 使用默认步长"
        ./build/main -t $TYPE -n "$SOLVER" -o "${OUTPUT_DIR}/${OUTPUT_FILE}"
        
        # 如果输出文件存在，则生成图形
        if [ -f "${OUTPUT_DIR}/$OUTPUT_FILE" ]; then
            python src/plot.py "${OUTPUT_DIR}/${OUTPUT_FILE}"
            # 移动生成的图像到figures目录
            mv ${OUTPUT_FILE%.txt}.png $FIGURE_DIR/
            if [ -f "${OUTPUT_FILE%.txt}_3d_trajectory.png" ]; then
                mv ${OUTPUT_FILE%.txt}_3d_trajectory.png $FIGURE_DIR/
            fi
            if [ -f "${OUTPUT_FILE%.txt}_orbit_projection.png" ]; then
                mv ${OUTPUT_FILE%.txt}_orbit_projection.png $FIGURE_DIR/
            fi
        fi
    done
done

# 然后测试几种关键方法在不同步长下的表现
echo "测试关键方法在不同步长下的表现..."
KEY_SOLVERS=("ClassicalRK" "AdamsBashforth[4]" "AdamsMoulton[4]" "DormandPrince" "GLRK[2]")

for TYPE in "${TYPES[@]}"; do
    for SOLVER in "${KEY_SOLVERS[@]}"; do
        for STEP in "${STEP_SIZES[@]}"; do
            # 替换方法名中的方括号，使其适合作为文件名
            SOLVER_FILENAME=$(echo $SOLVER | tr '[]' '_')
            # OUTPUT_FILE="${OUTPUT_DIR}/${SOLVER_FILENAME}_type${TYPE}_step${STEP}.txt"
            OUTPUT_FILE="${SOLVER_FILENAME}_type${TYPE}_step${STEP}.txt"
            
            echo "运行: $SOLVER (类型 $TYPE) 步长 $STEP"
            ./build/main -t $TYPE -n "$SOLVER" -s $STEP -o "${OUTPUT_DIR}/${OUTPUT_FILE}"
            
            # 如果输出文件存在，则生成图形
            if [ -f "${OUTPUT_DIR}/${OUTPUT_FILE}" ]; then
                python src/plot.py "${OUTPUT_DIR}/$OUTPUT_FILE"
                # 移动生成的图像到figures目录
                mv ${OUTPUT_FILE%.txt}.png $FIGURE_DIR/
                if [ -f "${OUTPUT_FILE%.txt}_3d_trajectory.png" ]; then
                    mv ${OUTPUT_FILE%.txt}_3d_trajectory.png $FIGURE_DIR/
                fi
                if [ -f "${OUTPUT_FILE%.txt}_orbit_projection.png" ]; then
                    mv ${OUTPUT_FILE%.txt}_orbit_projection.png $FIGURE_DIR/
                fi
            fi
        done
    done
done

# 创建结果比较图表
# echo "生成比较图表..."
# for TYPE in "${TYPES[@]}"; do
#     python src/compare_results.py $OUTPUT_DIR $FIGURE_DIR $TYPE
# done

echo "==================== 测试完成 ===================="
echo "结果保存在 $OUTPUT_DIR 目录"
echo "图像保存在 $FIGURE_DIR 目录"